import axios from 'axios';
// import Qs from 'qs';
import { Message, Loading } from 'element-ui';

// 创建一个axios实例
const service = axios.create({
  timeout: 60000, // 超时时间60s
  withCredentials: true // 允许携带cookie
});
let timer = null;
let loading; // 定义loading变量
function startLoading() {
  // 使用Element loading-start 方法
  loading = Loading.service({
    lock: true,
    text: '加载中……',
    background: 'rgba(0, 0, 0, 0.7)'
  });
}

function endLoading() {
  // 使用Element loading-close 方法
  loading.close();
}
// 那么 showFullScreenLoading() tryHideFullScreenLoading() 要干的事儿就是将同一时刻的请求合并。
// 声明一个变量 needLoadingRequestCount，每次调用showFullScreenLoading方法 needLoadingRequestCount + 1。
// 调用tryHideFullScreenLoading()方法，needLoadingRequestCount - 1。needLoadingRequestCount为 0 时，结束 loading。
let needLoadingRequestCount = 0;
export function showFullScreenLoading() {
  if (needLoadingRequestCount === 0) {
    startLoading();
  }
  needLoadingRequestCount++;
}
export function tryHideFullScreenLoading() {
  if (needLoadingRequestCount <= 0) return;
  needLoadingRequestCount--;
  if (needLoadingRequestCount === 0) {
    endLoading();
  }
}
// 请求发送处理
service.interceptors.request.use(
  config => {
    // 处理axios的post请求，只适用于该项目
    if (config.method === 'post') {
      if (config.data && typeof config.data === 'object') {
        // 如果有双层对象，将第一层转成json字符串
        config.data.data = JSON.stringify(config.data.data);
        config.headers.post['Content-Type'] = 'application/json;charset=utf-8';
      }
      // config.data = Qs.stringify(config.data);
    }
    clearTimeout(timer);
    timer = setTimeout(function() {
      showFullScreenLoading();
    }, 1500);
    // 可以对用户权限进行请求进行拦截 Promise.reject(error)
    // 在发送请求做一些事情
    return config;
  },
  error => {
    // 发送请求失败报错
    // console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 20 * 1000,
      showClose: true
    });
    Promise.reject(error);
  }
);

// respone拦截器
service.interceptors.response.use(
  response => {
    clearTimeout(timer);
    setTimeout(function() {
      tryHideFullScreenLoading();
    }, 500);

    if (response.status === 200 || response.status === 302) {
      // 如果是SSO接口直接跳转
      const msg = response.data.message;
      if (msg && msg.indexOf('oauth2/authorize') !== -1) {
        window.location.href = msg;
      }
    } else {
      // 非200状态的处理
      console.log(JSON.stringify(response));
    }

    return response.data;
  },
  error => {
    clearTimeout(timer);
    setTimeout(function() {
      tryHideFullScreenLoading();
    }, 500);
    console.log('err' + error); // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 20 * 1000,
      showClose: true
    });
    return Promise.reject(error);
  }
);

export default service;
